﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using FinanSoft.Entities;
using FinanSoft.Utilities;
using FinanSoft.BusinessLayer;

namespace FinanSoft
{
    public partial class frmPeriodo : Form
    {
        private int[] currencyIds;
        private int[] periodIds;

        public frmPeriodo()
        {
            InitializeComponent();
            agregarPeriodos();
        }
        // Funcion que me agrega todos los periodos a un combobox
        private void agregarPeriodos()
        {
            cmbPeriodos.Items.Clear();
            AccountingPeriod[] arregloPeriodos = PeriodManager.GetInstance().GetAccountingPeriod();
            periodIds = new int[arregloPeriodos.Length];
            for (int ele = 0; ele < arregloPeriodos.Length; ele++)
            {
                cmbPeriodos.Items.Add(arregloPeriodos[ele].Name);
                periodIds[ele] = arregloPeriodos[ele].Id;
            }
        }


        // Funcion que me llena el formulario
        public void llenarDataGrid()
        {
            gridTemporada.Rows.Clear();
            AccountingPeriod[] arregloPeriodos = PeriodManager.GetInstance().GetAccountingPeriod();
            for (int p = 0; p < arregloPeriodos.Length; p++)
            {
                if (cmbPeriodos.SelectedItem.ToString().Equals(arregloPeriodos[p].Name))
                {
                    
                    Season[] temps = arregloPeriodos[p].Seasons;
                    for (int y = 0; y < temps.Length; y++) 
                    {
                        Season temp = temps[y];
                        gridTemporada.Rows.Add(new object[] 
                            {temp.Name, PeriodManager.GetInstance().GetSeasonStatus(temp.Status).Name, temp.StartDate, temp.EndDate});
                    }
                   
                }
                else { }
            }

        }
        //Funcion que me saca todos los Id de la temporada
        public int[] temporadasId() 
        {
            int[] temporadasIdPeriodo;
            AccountingPeriod[] periodos = PeriodManager.GetInstance().GetAccountingPeriod();
            for (int h = 0; h < periodos.Length; h++) 
            {
                if (cmbPeriodos.SelectedItem.ToString().Equals(periodos[h].Name)) 
                {
                    temporadasIdPeriodo = new int[periodos[h].Seasons.Length];
                    for (int i = 0; i < temporadasIdPeriodo.Length; i++ ) 
                    {
                        temporadasIdPeriodo[i] = periodos[h].Seasons[i].Id;
                    }
                    return temporadasIdPeriodo;
                    
                }else{}
            }
            temporadasIdPeriodo = new int[1];
            return temporadasIdPeriodo;

        }


        
        // Metodos Creados
        private void btnSalir_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void btnAgregarPeriodo_Click(object sender, EventArgs e)
        {
            // Cargamos y mostramos el formulario CrearPeriodo
            frmCrearPeriodo frmCrearPeriodoV = new frmCrearPeriodo();
            frmCrearPeriodoV.ShowDialog(this);     // Mostramos el formulario de forma modal.

            agregarPeriodos();
        }

        private void btnEditarPeriodo_Click(object sender, EventArgs e)
        {
            // Cargamos y mostramos el formulario CrearPeriodo
            frmCrearPeriodo frmCrearPeriodoV = new frmCrearPeriodo();
            frmCrearPeriodoV.ShowDialog(this);     // Mostramos el formulario de forma modal.
        }

        private void btnAgregarTemp_Click(object sender, EventArgs e)
        {
            // Cargamos y mostramos el formulario CrearTemporada
            frmCrearTemporada frmCrearTemporadaV = new frmCrearTemporada();
            frmCrearTemporadaV.ShowDialog(this);     // Mostramos el formulario de forma modal.
            llenarDataGrid();
            
        }

        private void btnEditarTemp_Click(object sender, EventArgs e)
        {
            // Cargamos y mostramos el formulario CrearTemporada

            if (gridTemporada.SelectedRows.Count == 0)
            {
                MessageBox.Show(MessageConstants.NO_SELECTED_CURRENCY, MessageConstants.TITLE, MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            else 
            {
                int x = gridTemporada.SelectedRows[0].Index;
                int[] Ids = temporadasId();
                int editedId = Ids[x];
                string periodo = cmbPeriodos.SelectedItem.ToString();
                frmEditarTemporada frmEditarTemporadaV = new frmEditarTemporada(periodo, editedId);
                frmEditarTemporadaV.ShowDialog(this);     // Mostramos el formulario de forma modal.
                llenarDataGrid();
            }

            
            
        }

        private void btnConsultar_Click(object sender, EventArgs e)
        {
            if (cmbPeriodos.Text.Equals(""))
            {
                MessageBox.Show(MessageConstants.CONSULT_PERIOD, MessageConstants.TITLE, MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            else { llenarDataGrid(); }
            
        }

        private void gridTemporada_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void accCloseBtn_Click(object sender, EventArgs e)
        {
            if (cmbPeriodos.SelectedIndex == -1)
            {
                MessageBox.Show(MessageConstants.CONSULT_PERIOD, MessageConstants.TITLE, MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            else 
            {
                if (PeriodManager.GetInstance().MakeAccountingClose(periodIds[cmbPeriodos.SelectedIndex]))
                {
                    foreach (Season season in PeriodManager.GetInstance().GetPeriod(periodIds[cmbPeriodos.SelectedIndex]).Seasons)
                        if(season.Status != PeriodManager.GetInstance().GetSeasonStatus(Constants.CLOSED_SEASON_STATUS).Id)
                            PeriodManager.GetInstance().ModifyStatusSeason(season, PeriodManager.GetInstance().GetSeasonStatus(Constants.CLOSED_SEASON_STATUS).Id);
                    MessageBox.Show(MessageConstants.ACCOUNTING_CLOSE_SUCCESS, MessageConstants.TITLE, MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                }
                else
                    MessageBox.Show(PeriodManager.GetInstance().ErrorMessage, MessageConstants.TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void taxDividendBtn_Click(object sender, EventArgs e)
        {
            if (cmbPeriodos.SelectedIndex == -1)
            {
                MessageBox.Show(MessageConstants.CONSULT_PERIOD, MessageConstants.TITLE, MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            else
            {
                if (PeriodManager.GetInstance().MakeIncomeStatementEntries(periodIds[cmbPeriodos.SelectedIndex]))
                    MessageBox.Show(MessageConstants.ACCOUNTING_CLOSE_SUCCESS, MessageConstants.TITLE, MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                else
                    MessageBox.Show(PeriodManager.GetInstance().ErrorMessage, MessageConstants.TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}
